package com.zlsy.learning.leetcode.stack.s155;

import java.util.Stack;

/**
 * @author zhouliang
 * @date 2020/8/11 13:56 方法一、使用辅助栈
 *
 * 时间复杂度：O（1）
 * 空间复杂度：O（N）
 */
public class MinStack1 {

  /** 定义一个数据栈，用于存放栈数据 */
  private static Stack<Integer> dataStack = new Stack<>();
  /** 定义一个最小栈，顶部用于存放最小栈数据 */
  private static Stack<Integer> minStack = new Stack<>();

  public static void push(int x) {
    // 将数据压入数据栈
    dataStack.push(x);
    // 如果最小栈为空或则当前要压入数据栈的数据比最小栈的最小值（顶部数据）还要小就压入最小栈
    if (minStack.isEmpty() || x <= minStack.peek()) {
      minStack.push(x);
    }
  }

  public static Integer pop() {
    // 从数据栈的栈顶取出元素并返回
    Integer pop = dataStack.pop();
    // 如果最小栈里面有这个元素，且位于栈顶则需要把改最小值从最小栈移除
    if (pop.equals(minStack.peek())) {
      minStack.pop();
    }
    return pop;
  }

  /**
   * 查看栈顶元素，不取出来，并且返回。
   *
   * @return 栈顶元素
   */
  public static int top() {
    return dataStack.peek();
  }

  /**
   * 获取最小栈元素
   *
   * @return 最小栈元素
   */
  private static int getMin() {
    return minStack.peek();
  }
}
